package cn.itsource.basic.util;

import com.alibaba.fastjson.JSONObject;
  import org.apache.commons.lang3.StringUtils;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.data.redis.core.StringRedisTemplate;
  import org.springframework.stereotype.Component;
  
  import java.util.concurrent.TimeUnit;
  
  @Component
  public class RedisService {
      @Autowired //StringRedisTemplate它是redisTemplate的子类，而且独有特点：它保存的数据key和value都是string
      private StringRedisTemplate stringRedisTemplate;
  
      /**
       * 向Redis中存储 key-value键值对数据，value的类型为object
       *
       * @param key
       * @param value
       */
      public void setStringKeyAndValue(String key, Object value) {
  
          stringRedisTemplate.opsForValue().set(key, JSONObject.toJSONString(value));
      }
  
      /**
       * 保存key-value键值对到 redis,存储的value是字符串类型
       *
       * @param key
       * @param value
       */
      public void setStringKeyAndValue(String key, String value) {
          stringRedisTemplate.opsForValue().set(key, value);
      }
  
      /**
       * 存储的数据，多了一个 有效时间
       *
       * @param key
       * @param value
       * @param minute
       */
      public void setStringKeyAndValue(String key, Object value, long minute) {
          stringRedisTemplate.opsForValue().set(key, JSONObject.toJSONString(value), minute, TimeUnit.MINUTES);
      }
      public void setStringKeyAndValue(long seconds,String key, Object value) {
          stringRedisTemplate.opsForValue().set(key, JSONObject.toJSONString(value), seconds, TimeUnit.SECONDS);
      }

      public void setStringKeyAndValue(String key, String value, long minute) {
          stringRedisTemplate.opsForValue().set(key, value, minute, TimeUnit.MINUTES);
      }

      public String getKeyStringValue(String key) {
          return this.getKeyObjectValue(key,String.class);
      }
  
      /**
       * 功能说明 取出对象并转换为对象类型
       *
       * @param key
       * @param clazz
       * @return T
       * @author caiwen
       * @date 2020/8/22
       */
      //传入的这个数据类型，可能是2种类型：1string; 2object，如果是object，要进行泛型转换
      public <T> T getKeyObjectValue(String key, Class<T> clazz) {
          T t = null;
          String s = stringRedisTemplate.opsForValue().get(key);//json格式的字符串//{"name":"张三","age":22,"address":"湖北武汉长城科技园"}
          if (StringUtils.isBlank(s)) {
              return null;
          }
          //下面这个判断，是判断传入的Class类型是什么
          //clazz.getName() 获取传入的参数clazz的数据类型
          if (StringUtils.equalsIgnoreCase(clazz.getName(), "java.lang.string")) {
              t = (T) s;
          } else if (StringUtils.isNotBlank(s)) {
              t = JSONObject.parseObject(s, clazz);
          }
          return t;
      }
  
      public void deleteRedisByKey(String key) {
          stringRedisTemplate.delete(key);
      }
  }
  